home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -seriously_amiga- / shareware / programming / other / kaliosisquantrum / morb / copper.s < prev    next >
Text File  |  1998-01-12  |  5KB  |  339 lines

  1. *
  2. * CdBSian Obviously Universal & Interactive Nonsense (COUIN)
  3. * (Absurdité CdBSienne Manifestement Universelle et Interactive)
  4. * ©1997-1998, CdBS Software (MORB)
  5. * Copper routine
  6. * $Id: Copper.s 0.5 1997/09/09 00:07:05 MORB Exp MORB $
  7. *
  8.  
  9. _CopperTable:
  10.      ds.l      1
  11. _CurrentCopperTable:
  12.      ds.l      1
  13. _Wait255Addr:
  14.      ds.l      1
  15. _Wait255:
  16.      ds.b      1
  17.      even
  18.  
  19. _MergeCopperLists:
  20.      movem.l   d0-7/a0-6,-(a7)
  21.  
  22.      move.l    #$00960000,d1
  23.  
  24.      lea       _Wait255Addr,a0
  25.      move.l    (a0),d0
  26.      beq.s     .Schglubulu
  27.  
  28.      move.l    d0,a1
  29.      move.l    d1,(a1)
  30.  
  31. .Schglubulu:
  32.  
  33.      clr.l     (a0)
  34.      sf        _Wait255
  35.  
  36.      lea       _CopperRepairBuffer,a0
  37.  
  38. .Loop:
  39.      move.l    (a0)+,d0
  40.      beq.s     RepairDone
  41.      move.l    d0,a1
  42.      move.l    d1,(a1)+
  43.      move.l    d1,(a1)+
  44.      move.l    d1,(a1)
  45.      bra.s     .Loop
  46.  
  47. RepairDone:
  48.      move.l    _CopperTable(pc),_CurrentCopperTable
  49.      lea       _CopperRepairBuffer,a5
  50.      lea       _MergeCopTmp,a6
  51.  
  52. CTLoop:
  53.      move.l    a6,a1
  54.      move.l    _CurrentCopperTable(pc),a4
  55.      lea       4(a4),a0
  56.  
  57. .InitLoop:
  58.      move.l    (a0)+,d0
  59.      bmi.s     InitDone
  60.      move.l    d0,a2
  61.      sf        d0
  62.  
  63. .Loop:
  64.      move.l    a2,d1
  65.      beq.s     .Done
  66.      move.w    ce_YPos(a2),d1
  67.      beq.s     .Done
  68.      bpl.s     .CheckPrev
  69.      move.l    a2,a3
  70.      tst.w     ce_Type(a2)
  71.      sne       d0
  72.      move.l    (a2),a2
  73.      bra.s     .Loop
  74.  
  75. .CheckPrev:
  76.      tst.b     d0
  77.      beq.s     .Done
  78.      move.l    a3,a2
  79.  
  80. .Done:
  81.      move.l    a2,(a1)+
  82.      move.l    ce_YPos(a2),(a1)+
  83.      bra.s     .InitLoop
  84. InitDone:
  85.      moveq     #-1,d0
  86.      move.l    d0,(a1)
  87.  
  88.      move.l    (a4),a4
  89.      moveq     #0,d6
  90.      moveq     #0,d2
  91.  
  92.      moveq     #$20,d3   ; <----- provisoire (définitif)
  93.  
  94. .Loop:
  95.      move.l    a6,a0
  96.      moveq     #0,d7
  97.      bset      #31,d7
  98.      not.l     d7
  99.  
  100. .LLoop:
  101.      move.l    (a0)+,d0
  102.      beq.s     .Couin
  103.      bmi.s     .ProcessEntry
  104.      move.l    (a0)+,d1
  105.      cmp.l     d7,d1
  106.      bgt.s     .LLoop
  107.      move.l    d1,d7
  108.      move.l    d0,a2
  109.      move.l    a0,d4
  110.      bra.s     .LLoop
  111. .Couin:
  112.      addq.l    #4,a0
  113.      bra.s     .LLoop
  114.  
  115. .ProcessEntry:
  116.      cmp.l     #$00fffffe,d7
  117.      bne.s     .NonRien
  118.      st        _Wait255
  119. .NonRien:
  120.  
  121.      swap      d7
  122.  
  123.      tst.b     _Wait255
  124.      bne.s     .W255Ok
  125.  
  126.      move.w    #256,d0
  127.      cmp.w     d0,d7
  128.      bcs.s     .W255Ok
  129.  
  130.      st        _Wait255
  131.      tst.w     d6
  132.      bne.s     .Block
  133.      move.l    #$ffe1fffe,(a4)+
  134.      bra.s     .W255Ok
  135.  
  136. .Block:
  137.      sub.w     d6,d0
  138.      mulu      d5,d0
  139.      lea       (a4,d0.l),a0
  140.      move.l    #$ffe1fffe,(a0)
  141.      move.l    a0,_Wait255Addr
  142.  
  143. .W255Ok:
  144.  
  145.      move.l    d4,a0
  146.      subq.l    #8,a0
  147.  
  148.      move.w    ce_Type(a2),d0
  149.      bpl.s     .Long
  150.  
  151.      cmp.w     d7,d3
  152.      beq.s     .Chain
  153.      move.w    d7,d3
  154.  
  155.      move.l    ce_Data(a2),d0
  156.      bsr.s     InsertCopperJump
  157.  
  158.      move.l    d0,a3
  159.  
  160.      bra.s     .NextEntry
  161.  
  162. .Chain:
  163.      move.l    ce_Data(a2),d0
  164.  
  165.      move.w    #$86,d1
  166.      swap      d1
  167.      move.w    d0,d1
  168.      move.l    d1,(a3)+
  169.      swap      d0
  170.      move.w    #$84,d1
  171.      swap      d1
  172.      move.w    d0,d1
  173.      move.l    d1,(a3)
  174.      swap      d0
  175.  
  176.      move.l    d0,a3
  177.  
  178.      bra.s     .NextEntry
  179.  
  180. .Long:
  181.      bne.s     .Break
  182.  
  183.      move.l    a0,a6
  184.      move.l    ce_Data(a2),d4
  185.      move.l    d4,d0
  186.  
  187.      moveq     #0,d3
  188.  
  189.      tst.l     ce_SubType(a2)
  190.      beq.s     .NoMansLand
  191.      move.l    ce_BytesPerLine(a2),d5
  192.      move.w    d3,d1
  193.      move.w    d7,d3
  194.  
  195.      cmp.w     d7,d1
  196.      ble.s     .NoMansLand
  197.  
  198.      sub.w     d1,d3
  199.      mulu      d5,d3
  200.      add.l     d3,d0
  201.  
  202.      move.w    d7,d3
  203.  
  204. .NoMansLand:
  205.      bsr.s     InsertCopperJump
  206.      move.l    d4,a4
  207.      move.w    d3,d6
  208.      moveq     #0,d2
  209.      moveq     #0,d3
  210.  
  211. .NextEntry:
  212.      move.l    (a2),a1
  213.      move.l    a1,(a0)
  214.      move.l    ce_YPos(a1),4(a0)
  215.      bra.s     .Loop
  216.  
  217. .Break:
  218.      move.l    ce_Data(a2),d0
  219.      beq.s     .Terminate
  220.  
  221.      bsr.s     InsertCopperJump
  222.  
  223.      move.l    ce_CopperTable(a2),_CurrentCopperTable
  224.      bra.s     CTLoop
  225.  
  226. .Terminate:
  227.      bsr.s     TerminateChain
  228.  
  229.      tst.w     d6
  230.      bne.s     .AllDone
  231.      moveq     #-2,d0
  232.      move.l    d0,(a4)
  233. .AllDone:
  234.  
  235.      clr.l     (a5)
  236.      movem.l   (a7)+,d0-7/a0-6
  237.      rts
  238.  
  239. TerminateChain:
  240.      tst.l     d2
  241.      beq.s     .Done
  242.  
  243.      move.w    #$86,d1
  244.      swap      d1
  245.      move.w    d2,d1
  246.      move.l    d1,(a3)+
  247.      swap      d2
  248.      move.w    #$84,d1
  249.      swap      d1
  250.      move.w    d2,d1
  251.      move.l    d1,(a3)
  252.  
  253. .Done:
  254.      rts
  255.  
  256. InsertCopperJump: ; d0=Dest
  257.      bsr.s     TerminateChain
  258.  
  259.      tst.l     d6
  260.      beq.s     NoMansLand
  261.  
  262.      moveq     #CET_BREAK,d1
  263.      cmp.w     ce_Type(a2),d1
  264.      beq.s     .Late
  265.  
  266.      moveq     #CET_LATE,d1
  267.      cmp.w     ce_Type(a2),d1
  268.      bne.s     .NoLate
  269.  
  270. .Late:
  271.      move.l    d0,a1
  272.      move.l    #$c9fffe00,d1
  273.      move.b    d7,d1
  274.      ror.l     #8,d1
  275.  
  276.      move.l    d1,8(a1)
  277. .NoLate:
  278.  
  279.      sub.w     d6,d7
  280.      mulu      d5,d7
  281.      move.l    a4,a3
  282.      add.l     d7,a3
  283.      add.l     d5,a3
  284.  
  285.      subq.l    #8,a3
  286.      subq.l    #4,a3
  287.  
  288.      move.l    a3,(a5)+
  289.  
  290.      move.w    #$86,d1
  291.      swap      d1
  292.      move.w    d0,d1
  293.      move.l    d1,(a3)+
  294.      swap      d0
  295.      move.w    #$84,d1
  296.      swap      d1
  297.      move.w    d0,d1
  298.      move.l    d1,(a3)+
  299.      move.l    #$008a0000,(a3)+
  300.      swap      d0
  301.  
  302.      move.l    a3,d2
  303.      rts
  304.  
  305. NoMansLand:
  306.      move.l    #$01fffe00,d1
  307.      move.b    d7,d1
  308.      ror.l     #8,d1
  309.      move.l    d1,(a4)+
  310.  
  311.      moveq     #CET_BREAK,d2
  312.      cmp.w     ce_Type(a2),d2
  313.      beq.s     .Late
  314.  
  315.      moveq     #CET_LATE,d2
  316.      cmp.w     ce_Type(a2),d2
  317.      bne.s     .NoLate
  318.  
  319. .Late:
  320.      move.l    d0,a1
  321.      or.l      #$c80000,d1
  322.      move.l    d1,8(a1)
  323.  
  324. .NoLate:
  325.  
  326.      move.w    #$86,d1
  327.      swap      d1
  328.      move.w    d0,d1
  329.      move.l    d1,(a4)+
  330.      swap      d0
  331.      move.w    #$84,d1
  332.      swap      d1
  333.      move.w    d0,d1
  334.      move.l    d1,(a4)+
  335.      move.l    #$008a0000,(a4)+
  336.      swap      d0
  337.      move.l    a4,d2
  338.      rts
  339.